import { app, shell, BrowserWindow, ipcMain } from 'electron'
// app: 控制应用生命周期
// shell: 提供与桌面集成相关的功能，如打开外部链接
// BrowserWindow: 创建和控制浏览器窗口
// ipcMain: 主进程中处理渲染进程通信的模块

import { join } from 'path'
// 用于处理文件路径，join方法可以连接路径片段

import { electronApp, optimizer, is } from '@electron-toolkit/utils'
// electronApp: 提供应用程序增强功能
// optimizer: 提供性能优化工具
// is: 提供环境检测功能（如是否为开发环境）

import icon from '../../resources/icon.png?asset'
// 导入应用图标，?asset是Vite的资源导入语法

/**
 * 创建主窗口的函数
 */
function createWindow() {
  // 创建浏览器窗口实例
  const mainWindow = new BrowserWindow({
    width: 1600, // 窗口宽度
    height: 900, // 窗口高度
    show: false, // 初始不显示窗口，等待 ready-to-show 事件
    autoHideMenuBar: true, // 自动隐藏菜单栏，使界面更简洁
    ...(process.platform === 'linux' ? { icon } : {}), // 在Linux平台上设置应用图标
    webPreferences: {
      preload: join(__dirname, '../preload/index.js'), // 预加载脚本路径
      sandbox: false // 禁用沙箱模式，允许预加载脚本访问Node API
    }
  })

  // 开发调试用，取消注释可打开开发者工具
  // mainWindow.webContents.openDevTools()

  // 窗口准备好显示时触发
  mainWindow.on('ready-to-show', () => {
    mainWindow.show() // 显示窗口
  })

  // 处理窗口中的链接点击
  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url) // 在默认浏览器中打开链接
    return { action: 'deny' } // 阻止在Electron中创建新窗口
  })

  // 根据环境加载不同的内容
  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    // 开发环境：加载开发服务器URL（通常是热重载服务器）
    mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
  } else {
    // 生产环境：加载打包后的本地HTML文件
    mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
  }

  // 添加窗口状态管理
  let isMaximized = false

  // 监听窗口最大化事件
  mainWindow.on('maximize', () => {
    isMaximized = true
    // 可以通过IPC通知渲染进程窗口已最大化
    mainWindow.webContents.send('window-maximized', true)
  })

  // 监听窗口恢复事件
  mainWindow.on('unmaximize', () => {
    isMaximized = false
    // 可以通过IPC通知渲染进程窗口已恢复
    mainWindow.webContents.send('window-maximized', false)
  })

  // 设置IPC处理窗口控制命令
  ipcMain.handle('window-minimize', () => {
    mainWindow.minimize()
  })

  ipcMain.handle('window-maximize', () => {
    if (isMaximized) {
      mainWindow.unmaximize()
    } else {
      mainWindow.maximize()
    }
  })

  ipcMain.handle('window-close', () => {
    mainWindow.close()
  })
}

// 当Electron完成初始化并准备创建浏览器窗口时调用此方法
app.whenReady().then(() => {
  // 设置Windows上的应用用户模型ID，用于任务栏分组和通知
  electronApp.setAppUserModelId('com.electron')

  // 监听窗口创建事件，为每个新创建的窗口设置快捷键
  app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window) // 设置窗口快捷键（如F12打开开发工具）
  })

  // 设置IPC通信测试
  ipcMain.on('ping', () => console.log('pong'))

  // 添加更多IPC处理程序
  ipcMain.handle('get-app-version', () => {
    return app.getVersion() // 返回应用版本号
  })

  ipcMain.handle('get-platform', () => {
    return process.platform // 返回操作系统平台
  })

  // 创建主窗口
  createWindow()

  // 处理macOS上的应用激活
  app.on('activate', function () {
    // 在macOS上，当点击dock图标且没有其他窗口打开时，通常会重新创建一个窗口
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })

  // 设置应用自动更新检查（示例）
  // 实际项目中可以使用electron-updater库
  setTimeout(() => {
    console.log('可以在这里添加自动更新检查逻辑')
  }, 10000)
})

// 当所有窗口关闭时退出应用，除了在macOS上
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    // darwin是macOS的内核名称
    app.quit() // 退出应用
  }
})

// 添加未捕获异常处理
process.on('uncaughtException', (error) => {
  console.error('未捕获的异常:', error)
  // 在实际应用中，可以显示错误对话框或记录到日志文件
})

// 添加应用程序退出前的清理工作
app.on('will-quit', () => {
  // 执行清理操作，如关闭数据库连接、保存配置等
  console.log('应用即将退出，执行清理工作')
})
